/**
 * @content 要素同步编辑功能组件
 * @author  2019-09-25
 */
import { NativeModules } from 'react-native';

let FSC = NativeModules.JSFeatureSync;

import SyncBase from './SyncBase.js';

/**
 * @class FeatureSync
 * @description 要素同步编辑
 */
export default class FeatureSync extends SyncBase {
  // constructor(){
  //     super()
  //     Object.defineProperty(this,"_MGFeatureSyncId", {
  //         get:function(){
  //             return this._MGSyncBaseId
  //         },
  //         set:function(_MGFeatureSyncId){
  //             this._MGSyncBaseId = _MGFeatureSyncId
  //         },
  //     })
  // }

  /**
   * 指定范围下载异步执行
   * @memberOf FeatureSync
   * @param {String} strIGServerBaseURL 地图服务基地址
   * @param {String} strDataURL 数据地址
   * @param {Rect} extent 范围
   * @param {String} whereClause 属性条件
   * @param {DataBase} database 数据库对象
   * @param {XClsType} clsType 要素类类型
   * @param {String} clsName 类名
   * @return {Promise.<int>} 下载同步编号
   */
  static async downloadASyncByData(
    strIGServerBaseURL,
    strDataURL,
    extent,
    whereClause,
    database,
    clsType,
    clsName
  ) {
    try {
      return await FSC.downloadASync(
        strIGServerBaseURL,
        strDataURL,
        extent._MGRectId,
        whereClause,
        database._MGDataBaseId,
        clsType,
        clsName
      );
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 指定范围下载异步执行
   * @memberOf FeatureSync
   * @param {String} strIGServerBaseURL 地图服务基地址
   * @param {String} strDocName 地图文档名
   * @param {int} mapID 地图ID
   * @param {int} layerID 图层 ID
   * @param {Rect} extent 范围
   * @param {String} whereClause 属性条件
   * @param {DataBase} database 数据库对象
   * @param {XClsType} clsType 要素类类型
   * @param {String} clsName 类名
   * @return {Promise.<int>} 下载同步编号
   */
  static async downloadASyncByDoc(
    strIGServerBaseURL,
    strDocName,
    mapID,
    layerID,
    extent,
    whereClause,
    database,
    clsType,
    clsName
  ) {
    try {
      return await FSC.downloadASync(
        strIGServerBaseURL,
        strDocName,
        mapID,
        layerID,
        extent._MGRectId,
        whereClause,
        database._MGDataBaseId,
        clsType,
        clsName
      );
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 全图下载异步执行
   * @memberOf FeatureSync
   * @param {String} strIGServerBaseURL 地图服务基地址
   * @param {String} strDataURL 数据地址
   * @param {DataBase} database 数据库对象
   * @param {XClsType} clsType 要素类类型
   * @param {String} clsName 类名
   * @return {Promise.<int>} 下载同步编号
   */
  static async downloadAllASyncByData(
    strIGServerBaseURL,
    strDataURL,
    database,
    clsType,
    clsName
  ) {
    try {
      return await FSC.downloadAllASync(
        strIGServerBaseURL,
        strDataURL,
        database._MGDataBaseId,
        clsType,
        clsName
      );
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 全图下载异步执行
   * @memberOf FeatureSync
   * @param {String} strIGServerBaseURL 地图服务基地址
   * @param {String} strDocName 地图文档名
   * @param {int} mapID 地图ID
   * @param {int} layerID 图层 ID
   * @param {DataBase} database 数据库对象
   * @param {XClsType} clsType 要素类类型
   * @param {String} clsName 类名
   * @return {Promise.<int>} 下载同步编号
   */
  static async downloadAllASyncByDoc(
    strIGServerBaseURL,
    strDocName,
    mapID,
    layerID,
    database,
    clsType,
    clsName
  ) {
    try {
      return await FSC.downloadAllASync(
        strIGServerBaseURL,
        strDocName,
        mapID,
        layerID,
        database._MGDataBaseId,
        clsType,
        clsName
      );
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 更新异步执行
   * @memberOf FeatureSync
   * @param {IVectorCls} cls 矢量类对象
   * @return {Promise.<int>} 更新同步编号
   */
  static async updateASync(cls) {
    try {
      return await FSC.updateASync(cls);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 提交异步执行
   * @memberOf FeatureSync
   * @param {IVectorCls} cls 矢量类对象
   * @return {Promise.<int>} 提交同步编号
   */
  static async commitASync(cls) {
    try {
      return await FSC.commitASync(cls);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 捆绑
   * @memberOf FeatureSync
   * @param {IVectorCls} cls 矢量类对象
   * @param {String} strIGServerBaseURL 地图服务基地址
   * @param {String} strDocName 地图文档名
   * @param {int} mapID 地图ID
   * @param {int} layerID 图层 ID
   * @return {Promise.<int>} 成功:>0;失败：<=0
   */
  static async bindOfDoc(cls, strIGServerBaseURL, strDocName, mapID, layerID) {
    try {
      return await FSC.bind(
        cls,
        strIGServerBaseURL,
        strDocName,
        mapID,
        layerID
      );
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 捆绑
   * @memberOf FeatureSync
   * @param {IVectorCls} cls 矢量类对象
   * @param {String} strIGServerBaseURL 地图服务基地址
   * @param {String} strDataURL 数据地址
   * @return {Promise.<int>} 成功:>0;失败：<=0
   */
  static async bindOfData(cls, strIGServerBaseURL, strDataURL) {
    try {
      return await FSC.bind(cls, strIGServerBaseURL, strDataURL);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 停止同步
   * @memberOf FeatureSync
   * @param {int} lSyncCode  同步编号
   * @return  {Promise.<int>} >0 成功; <=0 失败
   */
  static async stopASync(lSyncCode) {
    try {
      return await FSC.stopASync(lSyncCode);
    } catch (e) {
      console.error(e);
    }
  }
}
